{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c982abca",
   "metadata": {},
   "source": [
    "# Interpretation 3A: KAN Compiler for PDE\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b9ec6c4",
   "metadata": {},
   "source": [
    "In scientific applications, we sometimes know empirical formulas or approximate solutions, represented as symbolic formulas. It would be nice to initialize the KAN network to be the approximate solution, and then fine tune the KAN network. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a42701c0",
   "metadata": {},
   "source": [
    "In this notebook, We aim to solve a 2D poisson equation $\\nabla^2 f(x,y) = -2\\pi^2({\\rm sin}(\\pi x){\\rm sin}(\\pi y) + 4\\epsilon\\ {\\rm sin}(2\\pi x){\\rm sin}(2\\pi y))$, with boundary condition $f(-1,y)=f(1,y)=f(x,-1)=f(x,1)=0$. The ground truth solution is $f(x,y)={\\rm sin}(\\pi x){\\rm sin}(\\pi y)+\\epsilon\\ {\\rm sin}(2\\pi x){\\rm sin}(2\\pi y)$. We set $\\epsilon$ to be a small number, and assume to know the approximate solution $f\\approx f_{\\rm approx}={\\rm sin}(\\pi x){\\rm sin}(\\pi y)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "d8f94f0f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.1\n"
     ]
    },
    {
     "data": {
      "image/png": "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39cVV1zBDAcA5DmCBgBAzc3N+u1vf6t77rlHDQ0NMsaooKBAFRUVmjVrlqZPn64hQ4aoS5cuCoVCamlp0d69e7VmzRq98MILevnll7Vr1y45jqNOnTrp5ptv1g9+8AN17do13X80AECaEDQAIM8dOnRIc+fO1QMPPKDW1lY5jqOLLrpI3/3udzVjxgx17ty53dfH43Ft2bJFDz74oB544AHV1dUpHA5r9uzZuv/++9W7d+8U/UkAAJmEoAEAeay5uVnf/va39Z//+Z+KxWIqLi7W7bffrttvv11du3aV4ziSpOXLl+uZZ57x7dHo3r27brnlFnXq1EmSDRwrV67UN7/5TVVVVUmSZs2apUceeUSlpaWp/8MBANKKoAEAecoYo1/84heaO3euWltb1a1bN913332aM2fOcfsrHnzwQd10002+tkGDBmnFihW+EGGM0Z49e3TLLbfo6aefluM4uvnmm/WrX/1KhYWFKflzAQAyA+doAECeqq6u1j333KPW1lZ17NhRv/jFL3T99def1SZux3HUq1cv3X///briiisUj8f10EMP6amnngqw5wCAbEDQAIA81NzcrB/96Efat2+fHMfRV7/6VV1//fUKhc5+WHAcR2VlZfr1r3+tIUOG6OjRo/rJT36iPXv2BNBzAEC2IGgAQB5atGiRFi1aJGOMRo4cqe9973sqKCgI7P0dx9GwYcN01113KRwOq7a2Vk888URg7w8AyHwEDQDIM7FYTA899JCOHj2qUCik2267Tb169Qr8Oo7j6LOf/azGjx8vY4z+8Ic/qKmpKfDrAAAyE0EDAPLMzp079frrr8sYowEDBuiqq676qLpU0Dp37qwbbrhBkvTOO+9ozZo1SbkOACDzEDQAIM+sWrVKdXV1kqSLL75YvXr1kjGm3Z/2nOx1l19+ubp27arm5mYtXrw46X8+AEBmOPPSIgCArLRq1SrFYjFJ0tSpUyVJDzzwgN599902X7N27drj2vbt26e77rpLHTp0OOFrevbsqW9961saOHCgBg8erJUrV2rlypUyxiRtBgUAkDkIGgCQZzZt2iRJikQiGj58uOLxuJ566im99NJLp/U+jY2N+t3vftfm7w8fPly33HKLunTp8lHQ2Lp1q6LRaKAbzwEAmYmlUwCQR4wxamhokDFGkUhE3bt3T/o1HcdRjx49JEkHDhxQNBpN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\n",
      "text/plain": [
       "<Figure size 1000x400 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from kan.compiler import kanpiler\n",
    "from sympy import *\n",
    "from kan.utils import create_dataset\n",
    "import torch\n",
    "\n",
    "torch.set_default_dtype(torch.float64)\n",
    "\n",
    "input_variables = x,y = symbols('x y')\n",
    "expr = sin(pi*x) * sin(pi*y) #+ 0.01 * sin(2*pi*x) * sin(2*pi*y)\n",
    "#expr = sin(pi*x) + y**2\n",
    "\n",
    "model = kanpiler(input_variables, expr, grid=5)\n",
    "\n",
    "x = torch.rand(100,2) * 2 - 1\n",
    "model.get_act(x)\n",
    "\n",
    "model.plot(scale=1.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "381b8a03",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.2\n"
     ]
    },
    {
     "data": {
      "image/png": "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ExER4eumifgtnUQpchJZWVksWLCACRMmsHz5cg6kpJCXlkblatWo37AhPXv25MYbb6R58+Y6kljkdxQuIn8iOTmZhx56iNmzZ1O3bl26d+/OBRdcQNWqVTlw4AArVqxg4cKF5Obmct9993HPPfcQHh7u62aL+A0Ni4n8zk8//cTgwYPZvn07Dz/8MLfddhuxsbE4joPjOBhjMMawbds2xowZw9NPP83WrVt5+eWXFTAiv1G4iBznwIED/P3vf2fXrl28//77tGvXjh07dlCrVq0Thr5ycnJYvnw5jz32GOeccw4PPfQQdevW5dFHH8Xl0joZEV0FIsd58803WbFiBU899RRt27Zl6NChXHPNNXz55ZeFPZbs7GyeeOIJEhISuO+++xg4cCB3330348aN48cff/T1WxDxC5pzEflNSkoKnTp1okGDBnz66afce++9fPDBBwDUqVOHDz74gK5duzJ69GhefPFFcnNzCQoKYuzYsQwaNIiLL76Ybt268cYbb2iCXwKeei4iv1m+fDnbt28nPj6eqlWrMnz4cBo1agTA7t27GTp0KDfffHNhsDiOw8CBAxk8eDAxMTH079+fr776itTUVN++ERE/oHAR+c0PP/xASEgI7dq1w3Ec2rdvz8SJE4mLiwNswEyePLkwWAYNGsQbb7xB9erVcRyHzp07k5KSws6dO338TkR8T+Ei8puUlBQqV65MjRo1AAoD5v333ycqKuqEn73ooot48803C4MFIDY2tnDDpUigU7iI/CY0NBSPx0Nubi5A4eT9nDlzSEtLO+Fnk5KSWLFixQnfy8nJwRhDpUqVyqzNIv5K4SLym0aNGpGens7WrVtPWBX24osvkpeXh+M4hftY9uzZw9ChQ09YRfbzzz9TuXJlatWq5eN3IuJ7ChcJeIcOHeLtt9/m7bffJicnhy+++ILc3FyefPLJEybvBw0axPTp00+Ygxk6dCjz588nLy+PWbNmERISwrZt29AiTAl0ChcJSNnZ2UyfPp3+/ftTu3Zt7rjjDmJiYmjRogUffvghmzdvJjMzE2NMYbC8+eab9OjRg0mTJhWuIjt06BBJSUksW7aMefPmkZGRQbdu3WjatCn//ve/2bx5s4/fqYiPGJEA4fF4zDfffGOGDRtmqlevbgBzwQUXmJdfftns3r3bGGPMV199ZapUqWL69etndu3aZUaMGGFuuOEGc+DAAePxeApf5/vvvzfnnnuuef75583WrVtNx44dTZs2bcy+ffvMV199ZW688UYTGRlpANOpUyfz+uuvm/379/vy7YuUKYWLVHgbN240jz76qGnYsKEBTP369c3IkSPNunXr/vCzeXl55oknnjAhISHm+uuvN5s3bzZpaWmFwVLA4/GYnTt3mrVr15pLLrnEREdHm+++++6En0lPTzeTJk0yV1xxhQkKCjKVKlUyV199tZk6darJzMws1fcs4mvaoS8VUkpKClOmTMHtdrN8+XKqVq3KoEGDSEhIoGvXrqes/5Wdnc2zzz7Ls88+y5lnnsmdd95J7969qV27NpUqVSInJ4dt27bx6aef8tZbb5Gfn4/b7ebSSy896Wvu3bu3sD0rVqygWrVqDBo0iPj4+L9sj0h5pHCRCiMjI4PPPvuMxMRE5syZg+M4XHHFFcTHx3PllVcSFhZW5NfKz89nzpw5PPnkk6xatYqIiAjq1q1LREQEhw8fZvfu3eTl5dG/f39GjRpF48aNi/zaGzduJDExkcTERH799VcaNGjAkCFDSEhIoHnz5sV56yJ+R+Ei5Vp+fj6LFy/G7XYzbdo0jh49SseOHUlISODaa6+lZs2aJXr9jIwMVqxYwddff8369es5evQosbGxtG/fnu7du9O4cWOCgoKK9doej4clS5bgdrv56KOPSE1NpXXr1iQkJHD99ddTu3btErVdxJcULlIurV27lsTERCZOnMjOnTtp1KgR8fHxxMfHn1Yv4nSZ31aPeVt2djazZ88mMTGRWbNmkZ+fT8+ePYmPj6dv3746UlnKHYWLlBu7du1i0qRJJCYmsnr1amrUqMH1119PfHw8HTt2rDCViA8ePMjUqVNxu9189913RERE0L9/fxISErjkkkuK3VMSKUsKF/FrR48eZfr06bjdbubPn09ISAhXXXUVCQkJXH755YSEhPi6iaUqOTmZiRMn4na72bRpE3Xq1OGGG24gPj6e8847r8IEqlQ8ChfxO3l5eXz55ZckJiYyffp0MjMz6datG/Hx8QwcOPAPRSQDgTGG5cuXk5iYyIcffsj+/ftp0aIF8fHxDBkyhHr16vm6iSInULiIXzDGsHLlysIPz5SUFJo3b05CQgI33HADZ555pq+b6Ddyc3OZN28ebrebGTNmkJ2dzcUXX0xCQgIDBgygatWq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\n",
      "text/plain": [
       "<Figure size 500x400 with 10 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.expand_depth()\n",
    "model.get_act(x)\n",
    "model.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "5c5f92c9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.3\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 500x400 with 18 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.expand_width(1, 1, sum_bool=False)\n",
    "model.get_act(x)\n",
    "model.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "45c8e738",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.4\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAFICAYAAACcDrP3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABB8UlEQVR4nO3dd3wUZf4H8M/spieE9IRIgFRqAkiXgASBCHgKKkpVOP0J2O7Qn54CehwonpwKeneAwP2UJniAotKR3quQgBBSSCAFQhqkZ3fn+/sj7JJeZ3dmNt/3vXgdkt3sd3bmmc88z8w8IxARgTHGGJOQRu4CGGOMWR8OF8YYY5LjcGGMMSY5DhfGGGOS43BhjDEmOQ4XxhhjkuNwYYwxJjkOF8YYY5LjcGGMMSY5DhfGGGOS43BhjDEmOQ4XxhhjkuNwYYwxJjkOF8YYY5LjcGGMMSY5G7kLYEwNiAjZ2dkoKCiAi4sLPD09IQiC3GUxpljcc2GsDnl5efjyyy8RGhoKb29vBAYGwtvbG6Ghofjyyy+Rl5cnd4mMKZLAT6JkrGa7d+/GM888g6KiIgDlvRcjY6/FyckJW7ZsQXR0tCw1MqZUHC6M1WD37t0YPXo0iAiiKNb6Oo1GA0EQsH37dg4YxirgcGGsiry8PLRt2xbFxcV1BouRRqOBo6MjUlNT4ebmZv4CGVMBPufCWBWrV69GUVFRg4IFAERRRFFREdasWWPmyhhTD+65MFYBESE0NBRJSUloTNMQBAFBQUGIj4/nq8gYA4cLY5VkZWXB29u7We/39PSUsCLG1ImHxRiroKCgoFnvz8/Pl6gSxtSNw4WxClxcXJr1/latWklUCWPqxuHCWAWenp4IDg5u9HkTQRAQHBwMDw8PM1XGmLpwuDBWgSAIeOONN5r03jfffJNP5jN2H5/QZ6wKvs+FsebjngtjVbi5uWHLli0QBAEaTd1NxHiH/g8//MDBwlgFHC6M1SA6Ohrbt2+Ho6MjBEGoNtxl/DdHR0fs2LEDI0aMkKlSxpSJw4WxWkRHRyM1NRVLlixBUFBQpZ8FBQVhyZIlSEtL42BhrAZ8zoWxBiAiHDhwAI899hj27duHqKgoPnnPWB2458JYAwiCYDqn4ubmxsHCWD04XBhjjEmOw4UxxpjkOFwYY4xJjsOFMcaY5DhcGGOMSY7DhTHGmOQ4XBhjjEmOw4UxxpjkOFwYY4xJjsOFMcaY5DhcGGOMSY7DhTHGmOQ4XBhjjEmOw4UxxpjkOFwYY4xJjsOFMcaY5DhcGKuHTqdDWloarly5AgBITExETk4ORFGUuTLGlIsfc8xYLfLy8rBlyxasX78ely9fRn5+PsrKyuDg4ABvb28MGjQIL730EgYOHAgbGxu5y2VMUThcGKvBiRMnMGvWLMTExKBPnz4YPXo0IiIi4OLigry8PJw7dw6//PILEhIS8Pzzz+Ojjz6Ct7e33GUzphgcLoxVsWfPHkydOhUuLi745JNPMGrUKJSVlWHjxo0oLS2Fq6srxo8fD51Oh40bN2LevHno2rUr1q5dC19fX7nLZ0wROFwYq+DatWt4/PHH4ezsjI0bN6JLly4QBAFJSUl4+OGHcffuXQQGBuLcuXNwd3cHEeHo0aOYOHEihgwZglWrVsHe3l7uxWBMdnxCn7H7DAYDFi5ciNzcXPzrX/8yBUtdBEFAZGQkFi1ahJ9++gm7du2yULWMKRuHC2P3JSQk4JdffsHTTz+NyMjIeoPFSBAEjBkzBv3798fKlSuh1+vNXCljyseXuDB23/Hjx1FQUIBnnnkGycnJKCwsNP0sNTUVBoMBAFBWVobLly/D1dXV9HN/f388/fTTmDdvHm7duoW2bdtavH7GlITDhbH7rl69CicnJwQFBWH69Ok4duyY6WdEhNLSUgBAeno6hg8fbvqZIAj4/PPPER4ejqKiIqSnp3O4sBaPw4Wx+4qLi2FjYwN7e3uUlpaipKSkxtcRUbWf6fV6ODo6VgohxloyDhfG7vPx8UFxcTHy8vLQr18/ODs7m35WXFyM48ePm0LkkUceMd04KQgC2rVrh8zMTGg0Gri7u8u1CIwpBocLa/GKc4vx+6bfkfN9DkqKSnD69Gl8+umnlV6TlJSEPn364O7du/D19cX3338PNzc3088FQcDs2bPh5+fHQ2KMgcOFtVD6Uj0SdiYgZl0M4nfEQ9SLCBschnY57bB69WpMmDCh0gl7rVZr+rsgCNBoNKZ/IyKkp6dj8+bNePLJJ9G6dWuLLw9jSsPhwloMIsLN4zcRuz4Wv2/6HcW5xfDr4YfHFj6GbuO7wcXPBYZ/G/D222/jq6++wnvvvdegOcNKS0uxYMECFBcXY/r06Q2+hJkxa8bhwqxeVlwWYr+LxaXvLiH3ei5aB7RGr+m9ED4xHN5dKs8HNnXqVBw+fBiffvopnJycMHPmTDg4OAAAbGxsYGNjU6nHkp+fj48//hgbN27E4sWL0bFjR4svH2NKxNO/MKtUmFmIy/+9jJh1MUg/mw57V3t0ebYLIiZHoF1kOwia2nsXd+7cwWuvvYZt27YhOjoas2bNQufOnREXFwdRFGFnZ4eQkBCcPn0an332GS5cuID58+dj5syZlYbPGGvJOFyY1dAV6RD3Sxxi18cicXciIAChI0MRPikcoaNDYeto2+DfVVhYiJUrV+Krr77C7du3ERQUhNDQULRq1Qq5ubmIi4tDeno6evXqhb/+9a949NFHodHwhBeMGXG4MFUTDSJSDqcgZl0Mrv5wFaX5pWjbry3CJ4ej67iucPJyatbvv3XrFvbt24dDhw4hKSkJJSUlcHd3R7du3TBixAj069cPTk7N+wzGrBGHC1OlzEuZiFkfg0vfXcK9tHvwCPZA+KRwhE8Mh0eIh1k+02AwgIig0Wi4l8JYPThcmGrkp+cjdkMsYtfH4nbMbTh6OKLr810RMSkCD/V7iK/SYkxBOFyYopXml+Lq1quIXReL6/uvQ2unRdgTYQifHI6Q6BBo7fgEOmNKxOHCFEfUi0j6NQmx62NxdetV6Ip1aD+4PcInhaPLM13g4OYgd4mMsXpwuDBFICJknM9A7PpYXNp4CYWZhfDu7I3wSeHoNqEb3Nq7yV0iY6wR+CZKJqu85DzEfheL2O9ikXU1Cy6+Lug2oRsiJkfAr4cfn0dhTKW458Isrji3GFe2XEHMuhjcOHoDtk626DSmE8InhSPosSBobPhKLMbUjsOFWYShzID4nfGIXR+La9uuQdSLCBwaiIjJEeg0phPsXOzkLpExJiEOF2Y2RITUk6mIWRdTPlFkTjH8uvuVn0cZ3w2t/FvJXSJjzEw4XJjksuOzy8+jrI9FblIuXNu6InxiOMInhcOnq4/c5THGLIDDhUmi8E75RJGx62ORdjoN9q3s0fmZzoiYHIH2g9vXOVEkY8z6cLiwJtMV63Bt2zXErotFwu4EAEBIdAjCJ4Uj7A9hjZookjFmXThcWKOQSOUTRa6PwZUtV1B6rxQP9X0I4ZPC0fW5rnD2dq7/lzDGrB6HC2uQO7/fQcy6GMR+F4t7qffgHuRePlHkhHB4hnnKXR5jTGH4JkpWq/yMfFzaeAmx62Jx6+ItOLo7ostz5Q/catu/Ld/gyBirFfdcWCVlBWXlE0Wuj0XSviRobDTlE0VOCkfI4yGwsefjEcZY/ThcGES9iOv7r5c/cGvrVeiKdGgX2Q4RkyPQ+ZnOcHR3lLtExpjKcLi0UESEWxdumSaKLLhVAK+OXqYHbrl1cJO7RMaYivEYRwuTl5KHSxsuIfa7WNz5/Q6cfZzRbXw3hE8KR5uH2/B5FMaYJLjn0gKU5JXgyg/lE0WmHE6BraMtOj7VERGTIxD4WCC0tvzALcaYtDhcrJShzICE3QnlE0X+cg2GMgMChwYifFI4Oo3tBPtW9nKXyBizYhwuVoSIkHY6rXyiyP/+jqLsIviG+yJ8cvlEka4PucpdImOsheBwsQI5CTmmB27lJOSglX8r00SRvuG+cpfHGGuBOFxUqiirCJc3XUbsuliknkqFnYtd+USRkyLQ/tH20Gj5gVuMMflwuKiIvkRfPlHk+ljE74wHCAgeEYzwyeHo+IeOsHXiiSIZY8rA4aICRISdb+zEpQ2XUHK3BP69/csfuPV8Nzj78ESRjDHl4XCxoLLSMqRcSgGacCsJieWrqcnPRSEgqEcQtFq+7JgxZn58E6UFZWdmo6ioCLa2Fhy+IuDcinMIGxeGNoVt4OLqYrnPZoy1WBwuFtapbyfY21vmHhMiwtG/H0XKdyno/kx3ELiTyhizDL6kyEoREY59egyH5h3C4A8GI2BAgNwlMcZaEA4XK2QMloN/PYhBcwdh0JxBcpfEGGthOFysDBHh2KL7wTJnEAbPHcyTUTLGLI7DxYoQEY7/4zgOfngQg2YPwuAPOFgYY/LgcLESRITji47jwAcHynssH3KwMMbkw+FiBYw9lgMfHkDk7EjusTDGZMfhonKmYPngACLfj8SjHz7KwcIYkx2Hi4oREY5/ViFY/srBwhhTBg4XlSIinPjsBA7MPYDI9zhYGGPKwnfoq5CpxzKXeyyMMWXinovKcLAwxtSAw0VFKgbLwPcG8sl7xphicbioRMVzLAPfG4ghfx3S9On3GWPMzPiciwoYg2X/3P0PTt5zsDDGFIzDReGqDYVxsDDGVIDDRcGq3SDJJ+8ZYyrB51wUioOFMaZm3HNRINO0+R8eRORsntKFMaY+3HNRGNODvjhYGGMqxj0XBan0BMk5/DwWxph6cbgoBBHh6N+Plj/zfu5gDJo7iIOFMaZaHC4KQEQ4+slRHPobBwtjzDpwuMiMiHB04VEcmn8Igz8YjEFzOFgYY+rH4SIjIsKRhUdweP5hDP5wMAbN5mBhjFkHDheZEBGOfHwEhxccxqMfPorI2ZEcLIwxq8HhIgMiwuEFh3Hk4yMYMm8IBr43kIOFMWZVOFwsjIhweP5hHFl4BEP+NgQD/8LBwhizPhwuFpZ8MBlHFh5B1PwoPPLuIxwsjDGrxOFiYXpXPUKnhcJ3hC+SLiZZ7HPz7+UjuEewxT6PMdayCUREchfRUpSWlCL+XLxsn9+pXyfY2PDxBGPM/DhcGGOMSY4PY1Wi4jEAn6dhjCkdz4qsErcu3MIC2wW4deGW3KUwxli9OFwYY4xJjsOFMcaY5DhcGGOMSY7DhTHGmOQ4XBhjjEmOw4UxxpjkOFwYY4xJjsOFMcaY5DhcGGOMSY7DhTHGmOQ4XBhjjEmOw4UxxpjkOFwYY4xJjsOFMcaY5DhcGGOMSY7DhTHGmOQ4XBhjjEmOw4UxxpjkOFwYY4xJjsOFMcaY5DhcGGOMSY7DhTHGmOQ4XBhjjEmOw4UxxpjkbOQugNVNFEXk5eUh6UYSMikTqempcA1zhbOzs9ylMWYxxnaQnZ2NsrIyuLi4wMvLi9uBgglERHIXwaorKSnB/v37sWbNGpw5cwZZmVkoKSiBs5sz2ndojxEjRuDFF19E586dIQiC3OUyZhZV20F2djb0ej0cHBwQEBDA7UDBOFwUKCkpCe+++y62b98Of39/REVFoWfPnnB1dUV2djbOnj2LAwcOQKfT4a233sKbb74JJycnuctmTFLcDlSOmKJcvnyZIiIiyN3dnebPn08ZGRlkMBhIFEUiIhJFkQwGA12/fp3efPNNatWqFU2fPp0KCwtlrpwx6XA7UD8+56Ig2dnZeOWVV5Ceno5vvvkGffr0QWpqKnx9fSt1+cvKynDmzBl88MEH6NKlC9599134+/tj7ty50Gj4Gg2mbtwOrITc6cYeWLBgAdnb29PXX39NqampNHz4cPL396fdu3eTKIokiiIVFxfT+++/T/b29jRlyhTKysqiOXPmkKenJ507d07uRWCs2bgdWAcOF4W4ffs2BQUF0ZAhQygvL4+mTp1KAAgAtWnThnbv3k1FRUX0/vvvk62tLQEgrVZL//rXv+j27dvUuXNnmjFjhmnYgDE14nZgPThcFGLbtm1ka2tLq1atIlEU6eTJkxQcHFypYY0fP97UoARBoOeff56ys7NJFEWaM2cOhYSEUE5OjtyLwliTcTuwHjwwqRC//fYb7Ozs0KdPHwiCgL59+2L9+vUICgoCAGRkZGDjxo3Q6XQQBAHjxo3D0qVL4e7uDkEQMHDgQGRmZiItLU3mJWGs6bgdWA8OF4XIzMyEg4MDPDw8AMDUsL755hu4ublVeu3gwYOxbNkyU4MCAB8fH9ONZoypFbcD68HhohD29vYQRRE6nQ4AQEQoLS3Frl27UFBQUOm1cXFxOHv2bKV/KysrAxHB1tbWYjUzJjVuB9aDw0UhgoODUVhYiOTkZFODmj9/Pj777DPo9XoIgmC6QezWrVuYOnUq9u7dCyo/b4Zr167BwcEBvr6+Mi8JY03H7cB6cLgoRL9+/WBnZ4edO3dCp9Pho48+wmeffVZpbPnHH3+sNPY8depU7Nu3D3q9Htu2bUOXLl3Qpk0bmZeEsabjdmA9OFwUokuXLhgwYAA2bNiAhIQEFBcXg4hMDWrZsmUYPnw4vvvuOwQHBwMAcnNzERcXh9OnT+PXX3/FhAkTYG9vL/OSMNZ03A6siDwXqbGqysrK6PnnnycANHbsWEpPT6dZs2bRxIkTTZdZEpVPe3Hq1Cnq2rUrLVq0iJKTk6l///4UGBjIl18y1bt9+zb17du3ye2gc+fO3A4UgsNFARISEqhPnz6k1Wpp+PDhZGdnR+PHj6eEhAQqKCiodkOYKIqUlpZGsbGxNHToULKzsyMA9OKLL9K9e/dkWgrGmmf37t3k6+tLXl5eNHny5Ea3A61WS1qtlj7//HMyGAwyLQUz4nCR2Zo1a8jFxYWCg4Pp9OnTVFJSQvPmzSMHBwfq2LEjffXVVxQfH0/5+flUUlJC9+7do0uXLtFHH31Ebdu2pTZt2tDevXtp9erV5OLiQiEhIXTmzBm5F4uxBistLaX//d//JQA0YsQIysjIaFI72LFjB7399tsEgB5//HG6deuW3IvWonG4yOTu3bs0adIkAkAvvPBCpR6HXq+nbdu2Uf/+/cnOzo7c3d2pa9eu1LdvX+rYsSO5urqSk5MTTZ48meLj403vi4+Pp969e5ONjQ0tWrSIj96Y4sXFxdHDDz9Mtra29Nlnn1XaZpvaDnbt2kW+vr7k4+NDO3fulGOxGBHx81xkcOrUKUycOBF37tzB8uXLMXHixBpfV1RUhLNnz+Lw4cO4fPky8vPz4ePjg759+yIqKgohISHQarWV3lNWVoYPPvgAixYtwvDhw7F69Wq+coYpDhFh9erVeP311+Hv748NGzagV69eNb62Ke3g9u3bmDZtGnbu3IlZs2bhk08+4ZP8liZzuLUoer2eFi5cSDY2NtSvXz9KTExs1PsbMxnf3r17yc/Pj7y8vGjbtm2NLZUxs8nNzaXx48cTAJo2bRrl5+c36v0NbQcGg4EWL15MdnZ21LNnT7p69WpTymVNxOFiIampqRQVFUWCINDs2bOprKzM7J+ZmZlJo0ePJgD0xhtvUHFxsdk/k7G6HDt2jNq3b0+urq60ceNGi3zm+fPnqWPHjuTk5GSaEJOZH4eLBWzdupU8PDzooYceov3791v0s0VRpK+++ors7e0pIiKCfv/9d4t+PmNE5b32+fPnk1arpUceeYSuX79u0c8vKCigl19+mQDQuHHjKDc316Kf3xJxuJhRUVERvfrqqwSAnnrqKcrKypKtlosXL1Lnzp3J0dGRvv76az56YxZz48YNevTRR0mj0dCHH35IOp1Otlo2bdpEbm5u1K5dOzp69KhsdbQEHC5mEhsbS926dSMHBwdaunSpInbmhYWFNH36dAJATz/9NGVnZ8tdErNyW7ZsIXd3d2rbti0dOnRI7nKIiCglJYUiIyNJo9HQvHnzZA07a8bhIjFRFOlf//oX2dvbU7du3Sg2Nlbukqqp2OAPHjwodznMChUWFtIrr7yi2AMZnU5H8+bNI41GQ5GRkZSSkiJ3SVaHw0VCd+7coSeffJIA0GuvvUZFRUVyl1SrikMVH3zwAR+9MclcuHDBNAS7YsUKRfTaa3PkyBFq164dubm50aZNm+Qux6pwuEhk37595O/vT56envTTTz/JXU6D6PV6WrBgAWm1WhowYIDFT7Iy6yKKIn355Zdkb29P3bt3V83FIzk5OTRu3DgCQC+//DIVFBTIXZJV4HBpprKyMnrvvfdIEAQaOnQopaamyl1Sox0/fpw6dOhArq6utGHDBrnLYSpU8bL3N998U3WXvYuiSKtWrSInJyfq2LEjnT9/Xu6SVI/DpRkSEhKob9++ZGNjQ5988gnp9Xq5S2qyvLw8041tU6dObfSNbazl2rNnD/n5+ZG3t7fqb9i9cuUK9ejRg+zs7Gjx4sWKHtJTOg6XJlq7di21atWKgoKC6NSpU3KXIwlRFOnbb78lZ2dnCg0NpbNnz8pdElOw0tJSeueddwgADR8+nNLT0+UuSRIlJSU0a9YsAkAjR47kCTCbiMOlke7evUuTJ08mADR58mS6e/eu3CVJLi4ujnr16kW2trb0j3/8gyfAZNVcu3aNevfubdXbyM6dO8nHx4d8fX1p165dcpejOhwujXDq1CkKCgqiVq1a0dq1a+Uux6wqHpUap0FnrGrv1tof73Dr1i2Kjo4mAPTWW29RSUmJ3CWpBodLAxgMBvrkk0/IxsaG+vbtSwkJCXKXZDEVx9O3b98udzlMRnl5eTRhwoQWd17OYDDQF198Qba2tvTwww9TXFyc3CWpAodLPdLS0mjo0KEkCAK9//77FplwUmlu375No0aNIgD0pz/9iY/eWqATJ05QYGBgi76i8Ny5cxQWFkbOzs70f//3f3yyvx4cLnX4+eefydPTk9q0aUP79u2TuxxZiaJIS5YsITs7O1Xdw8CaR6/X00cffURarZb69+9PSUlJcpckq/z8fPrjH/9IAOi5557jCTDrwOFSg6KiInrttdcIAD355JN0584duUtSjAsXLlCnTp1Ucfc1a56bN2/SkCFDSBAEmjt3bovstdfm+++/p9atW1P79u3p2LFjcpejSFb/JMqCggKkp6cjJycHtra28PHxga+vL+zs7Gp8/eXLlzF+/HjEx8fjiy++wMyZMyEIgoWrVraioiLMmjULK1aswLPPPosVK1bA3d291tc3dh0w6TV2HWzduhUvvfQSnJycsG7dOjz66KMWrlj5UlJSMHHiRJw6dQoffvgh5syZU+2JmBW1uHYgd7qZS2JiIr3//vvUtWtX07O2nZycyMvLi6Kioujbb7+t9Nx6URRp6dKl5ODgQF27dqWYmBgZq1eHzZs3k5ubGwUEBNDhw4er/byx64BJr7HroLCwkGbMmEEAaOzYsYqbcFJpdDodffjhh6TRaGjQoEE1ToDZUtuB1YWLXq+ntWvXUkBAAHl5edGUKVNozZo1dPDgQdq/fz+tWLGCxo4dS25ubjR06FC6fPkyZWVl0ZgxYwgAvfrqq4qecFJpbty4QYMHD670rI6mrAMmraasg5iYGOrSpQs5OjrS8uXLecizEQ4fPkwBAQHk5uZGmzdvJqKmrQNrYlXhYjAY6N///jc5OzvTyJEj6eLFi6TX6+n48eP05Zdf0pdffklXrlyhsrIyOnToEPXu3ZsCAgLIx8eHPDw8aOvWrXIvgipVfcrgggULGrUOOnbsqMhHE6hVU9qBj48P2draUnh4uNXt5CwlJyeHnn32WdMEmIsXL27R7cCqwuXAgQPk5uZGzz77LOXk5JiOvObOnUsACIDp5kdRFCklJYX69+9PrVu35gYlgWPHjpGvry8BoGeeeabB6+CRRx6hyMhIvvJGIk1tB23atOGbZZtJFEVauXIl2dnZkUajadHtQCPPmR7pFRcXY/78+fD19cXixYvh5uZW54l4QRAQEBCAf//737C3t8f+/fstWK116tmzJ8LCwhAWFoYlS5Y0eB3885//xLVr17Bu3ToLVmudmtMODAYDNm/ebMFqrY8gCJg0aRJ69uyJkJCQFt0OrCZczp07h5MnT+LVV1/FQw891KArvARBQI8ePfDcc8/h22+/RVFRkQUqtV7nzp3D2bNn8dprr/E6kAm3A/mdO3cOMTExLb4d2MhdgFQOHjwIe3t7DBs2DFeuXIFerzf97Pbt26a/37hxAzExMab/dnNzw5gxY7Bu3TokJyejS5cuFq3bmvA6kB+vA/nxOrhP7nE5qUyePJnCwsLo2rVr1K5dO3JwcDD9sbGxMY1z2traVvrZtGnT6Pr16+Tl5UU7d+6UezFUjdeB/HgdyI/XQTmr6LkQEUpKSmBvbw+tVouSkhKUlJTU+FqdTgedTmf677KyMtjZ2Znex5qG14H8eB3Ij9fBA1YRLoIgwMvLC6dPn4bBYEBUVBTy8vJMP4+Pj0dSUhIAIDw8HP7+/qafRUREIC8vD6WlpXBr7QYSCRAe/F7WMFKsg5LiEjhqHC1dulXx9PTE3bt3m9UOPDw8LF22qhERQA/+39OD1wEA6xkWW7lyJTk6OtLhw4dJr9dX+jN79mxTV3T16tWVfmYwGOjbb78lPz8/unnjJokGkQx6g+mPaBDL/4gi31RWj+auAxfBhd4W3qZV/VfRwb8dpLQzaSQa+Duviyje31515X++Xv51s9tBamqq3IulWKIoPthH6Kr8ub+/WLFiBa8DsqJLkYcOHYpWrVph9erVICJotVrTH43mwWJqNJpKPyspKcGaNWsQGRmJNv5tIGgEaLQaCBoBguZBz4VEAokE0SCa/k7WPS1bo5BIGDJ4SLPWwbDRwzBh1QS0btcaJxefxMq+K/G5/+f4adpPuPzfyyjJU/9QQXMRPdgORb0IMpRvg4JGgKAVMGz4sOa1g4GR8PX1lWvxFKXqd238vkms/J1rbDTlf+7vNx577LFm74v8/PzkWmzJWMWwGAB06NABkyZNwqpVqzB27FiMGjWq3mEtURTx7bff4rfffsPWrVsrTTpneq/p/4QHYVKhC0ygaq9vScNpxqAFgMCgwGavg16De6HXH3vBoDMg9UQq4nfGI2FHAi6svgCNVoOARwIQMjIEoaNC4RPu0yK+a9O2JlY4mBFQ7QAIaH47+PGHH6ERNKbh4Zbw/QJVhrYAoOJx4/3vuqHD5VLvi1RLng6TeWRkZFCfPn0oICCAfv31V9NzvT/88EOysbEhW1tbWrduHYmiSDqdjtauXUteXl40e/Zs0uv1TfpM43BZ1eG0qkNq1sS0vPeHAyoOXZlrHeTdyKOzX5+ljWM20kKXhTRPmEdftP2Cfn7lZ7ry4xUquWc9DzCrcejFuD01YFtq7jqouj1b6/Zb4/BWhe+5Ocstx75Iaaxuyv2LZy/iiYFPoMi5CDNfnYlp06ZBFEWkp6cDAAIDA3H37l0sXboUGzZswOTJk7Fo0SI4OTlJVgPdPwoy/b0CQWj4EZDS0P1hAuOy1XTkDAC///47pkyZguTkZMycKf060JfqcePIDVOvJisuC1pbLdoPbm/q1Xh29FTV90u19U7uby+NXRYp1gFVOZoXNIKqvlMANY42mAjmHXEwdztQOqsLl20ztuHo2qO4/dRtbN25FTY2NujSpQsCAgJgMBiQnJyMuLg4eHp64i9/+QumTJkCe3t7s9el5sBpaKhUlJaWhgULFuD77783+zrIScxBws4EJOxMwPUD16Ev0cM90B0ho0IQOjIUHYZ0gK2TbZN/vzlQlSuMADQrTGoi1TpQS8jUFySAtN9vQzR0Hbzzzjt48cUXLbIvshSrCpdr265hw5Mb8MTyJ9DjpR64cuUKtm/fjtOnTyMzMxO2trYIDAxEVFQURowYAR8fH1nrrS1wqp3vkakhVwqV+w2yvlCpyGAwWHwd6Ip0SD6YjPid8YjfHo+85DzYONggMCrQ1KtxD6r9wWbmZIlAqUrqdVDxQha5Q6bG79PIzN9rYzRkHXh5ejW6fSmd1YRL4Z1CLI9YDv/e/hj/8/hKGxQRwWAwQBAERZ8ooyonE+UKnGqhIsFORI51QETIjstG/I54JOxMQMrhFBh0Bnh19DL1atoNagcbe/Nd12LaGVcc7dLIs9OTch1UChkL7BTVEiT1qW0dGNuc3IEtJasIFyLCpnGbkHIoBTNjZ8LFz0XukiRTratfgdTjxeYIFSUpzS/F9X3XTedq7qXdg52zHYKGBSFkZAhCRoagdUDrZn2GHL0TOZkjZKoOw9V4nsSKv0traXdWES4X11zE1qlbMW7TOHR5RuWTvTWA1IFj7aFSEyJCZmymqVdz8/hNiAYRvuG+pl5N2wFtobWt/whfSb0TuTQ1ZKoNDdcSJMbfa+2M36NGq/5bEFUfLndv3MWyiGXo9FQnjFk9Ru5yZFNv4NTQQCvtFFtIqNSmOLcYSXuTkLAzAfE741GYWQiH1g4IHhFc3qt5PMTUI25pvZPGMB2ooHrINChIqv69hTENj1nB+RdVhwuJhLXD1yInMQczLs6AQ2sHuUtSlNouGKjYS4GA8juLW2hjrgmJhIzzGaZeTdrpNBAR2vRqg5DHQxASHQL/Pv7Q2GhadCDXRRTFSlcYArWcN2zBQVIbazn/oupwObH4BPa8vQcv7HsBgVGBcpejeMapLCoGS8WNt6UNQdSlYu+kMLMQiXsSkbi7/E9xbjGcPJ3Kg2ZkCIKjg+HkaR33JjRVbSfcCZWPxNW+w7QUaxgeU224ZF7OxMreK9H71d6I/jxa7nIUreIULVXPBSjlCjUlqHo/D4Bqw4WiXkTa6TTTRQEZv2VA0Aho26+t6VJnvx5+qh/SqEtTrtyqOlzGPZb6iQZR1cNjqgwXQ5kBq/qvgqHMgFfOvgIbB6uZIk1SVUOlUSdZgXoDR+07BynOneSn5yNhV/kNnIl7ElGaXwoXP5fyoBkZiqDhQaoerpX6EuCKv49Dpm5qHx5TZbjsn7sfxxYdw8unXkabnm3kLkdxmhoqdf5OC14SbU51TbPS3O/JUGbAzeM3Tb2azMuZ0Nho0G5gO1Ovxrurt2K/o4ZeAgw0fz1zyDSMmofHVBcuN4/fxDeDv8GQvw3B4DmD5S5HMaruNKUKlXo/E1B04Mh5ZVdeSp5pWpqkfUnQFenQOqC16VLnwKGBsHOxM9vn10UplwBzyNRPrcNjqgqXsoIyfN3zazh5O2Ha4WnQ2KgvzaXWlHm/zF2P3HOoKfFSYX2JHimHU0y9muz4bGjttOjwaAdTr8Yj1MMstdU355YSDgTUMn+ZHNQ6PKaqcNk2cxti1sZgxoUZ8AixgseANoPSQqUu5g4cJYZJfbLjs029muSDydCX6uER7GHq1bR/tD1sHRs/2WZ9QQIo+3vhkKmZGofHVBMu8Tvi8d0T32H0stHoPb233OXIptrd9CrsLgO1B05Dr1BTY6DUpqywDMkHkk29mryUPNg62iJw6IPJNt06uNX4XmuZc6smSpokUwnUNjyminApyirCsvBlaNOrDSb8MqFFbmTWPkVLQ65Qq+lEs7VNs0JEyLqS9WCyzSMpEPUivDt7m2YKCBgYUH1aGpUHSV0sPUmmUqlteEzx4UJE2PzcZiQfTMaMmBlo1aaV3CVZlLWHSl1EUTRdpGC6uqtCb81ad6bAg55Iyd0SJO1LQuLORCTsSkB+Rj7sXB5Mthk6KhSuD7nKXa5FcMg8+A7UsB9QfLhcXHsRW1/cinH/HYcuz1r/pJRGLTVU6psEUg1XqDVWQ6/cIiJkxlSYbPPETZBI8Ovu92Cyzf5trf5Cl5YeMmo5/6LocDFOStnxyY4Yu2as3OVYREsLFSnOnTRl0k65SDl5Y3FOMRL3JJom2yzKKoKDmwNCokNMQ2jOPs7mWRAFqGuSTGumlsktFRsuxkkps+OzMTNmJhzc1HuXc0O0pBmKGzLNihSfoYhLogGLXLlFIiH9bLrpooC0M2kQBAH+vf1NvRr/3v6K3hk1VUucWkYN518UGy4nl5zE7rd244VfX0Dg0EC5yzGbaucTFLyxNJVSruxq7hVqDf39SrgEuOB2ARJ3l/dqEnYnoCSvBM7ezg8m2xwRDEcPR7PXYUktLWSUPjymyHC58/sdrOi1Ar1n9kb0F9Y5KWVdk0laA3NOsyKVhs6hVum/K75XJZcAi3oRqSdTTb2aWxdvQdAICBgQYLoowLe7ryJqlUJLChklX56suHAxlBnwnwH/gb5Ej/85+z9NupFMycwx75cSKKV30lw1nb+pKUCqnRtR0TLeS7tnuoEzcW8iygrK0Mq/1YPJNocFwd7VXu4ym60lTC2j5OExxYXL/g/249inx/DyyZfR5mHrmZTSGkNFDb2Txqp6h3hNFwlU7M2o9Qo1I0OZATeO3jD1au5cuQONjQbtB7U39Wq8OnupctmMrD1klDo8pqhwuXniJr4Z9A2GzBuCwXPVPyll1Z2v2kPFWnonRs25cktNV6g1Ru71XFOv5vr+69AV6+DW3s10UUCHqA6wc5Znss3msuaQUeLwmGLCpazw/qSUXuqflFJN837Vx1oCxRKTNyrhCjUp6Yp1SDlUPtlm/PZ45CblwsbeBh2GVJhsU4Vz/Fnj/GVKHB5TTLhsf3U7Lq65iOm/TYdnqKfc5TSJNYSKVYWJAq7cspbAISLkxOeYbuBMPpQMQ5kBnqGeDybbHNxeVQ/us7aQUdrwmCLCJX5nPL4b/R1GLx2N3jPUOSllxWfTK6172hDV7oxXWaDUeO8MoLjlqPcKNYXUWZ+ygjJc33/ddK7m7s27sHWyRdBjQRi1dJSqpqSxppBR0vCYIsKl0s2Dal6pKt4oq87dpUbGhqW2ZagUOCqrHajSI1PpMhiRSOqu//6+1OrCRVemQ9LFJKl+XaOFPBwCrVZb/wtroYCcbdZGrfb6AfUvg9rrB7gdS6GltwMAkHSANDc7FwbRAFtbCe9NISArLguZlzLh39sfbu3dTOPUFRUWFKK4uBguLi7SfbaFmK5eUSm11w+ofxmkrN8s7RhAQUYB0s6kwbWtK9r0bMPtWIGkXAbJz76F9AyBnZ00lyoSEc4uP4sD7xyA1k6LK3QFI/4xAj1f6lntC7h391718fYmsuQGUnFIUCpqrx9Q/zKovX4p2zEA3Dh2A1v/uBWGUgP0JXo89c1T6Da+G7fjeqh5GZRxWUEtbh67iR2v70Cf1/pgZuxM9JjaA9tmbMPtmNtylyaJitNUqJHa6wfUvwxqqL84pxhrR6yFX3c/zLgwA91f7I4fX/gRVzZfkSxI5KSGdVAfcyyDYsNFNIjYOGYjAh4JwLBPhsH1IVdEfx4Nn24+WD9yvepXJoBKlyyrktrrB9S/DAqvn4jw/TPfw8beBhN+ngC3Dm4YvXQ0wieGY8ukLSjNL5W7xOZT+DpoEDMsg2LD5dzX51CcW4znf3jetMCCRsCknZNQcKsAF9dclLnC5iG6/0Q5qfvRFmKqX8VjzMZlUCs1rIM7l+8g5VAKntvynOkeGI1WgydXPQlBK2Dnn3bKXGHzqGEd1Mdc7UCR4UJE2PvuXnQe2xlOXk6Vfubi54LQ0aHY+aedqt0xVLqfRKO+yx5rvB9GZSougxovIVfDOiAibJ6wGa3btUaHIR0q/Uxrq0XUvCjErI2BrlgnT4HNVGkoSaHroD7mbAeKDJfkA8nQFekweunoagsrCAKeXPkkyvLLcPP4TZkqbD7j0Y4aN0hA/fUD6l8GpddfnF2MO5fv4Klvnqqxxv5v9YegEXBo/iEZqpOOGg9OKjLXdqS4cCEi/DL9F3iGecLJ26nG1zj7OqN1u9bYNnOb6novVY921Ebt9QPqXwa11L/nnT2wcbCp1msx0tpqEfFCBE4uOanudqxS5t6OFBcuZQVlyE3MrbHXYiQIAkZ+NRJ3Lt2BrkhlXWoVD8UAUH/9FahxGdQynEciIXZ9LPq+3rfOGod/OhyGUgPSz6RbsLrmUcs6qJeZl0Fx4XJy8UkIGqHWox2j0NGhEDQCTv/ztGUKk4DaT/6pvX7Aeo44lb4OUk+mQtSLGDRnUJ2vc/RwhLOvM3a+qa4T+2pYB3WxRFtWVLgQEU58cQLB0cH1XhKn0WoQOCwQRz89qooutdpP/qm9fkD9R5xqWge7/rwLLn4u9T7RUhAERM2LQtqZtPLJXxVOTeugNpZaBkWFS9GdIpTeK0X059ENen3059EovVuK4pxiM1fWPGrfqVWk9vqVfhK8NmrahkSDiPRz6YiaH9WgOru/2B0gIGFnggWqazo1rYPaWHIZFBUuhz8+DI2tBp4dG/Y8F+8u3tDYaHBs0TEzV9Z8au5GW8tQkhpOgtdFLdtQ0t4kgICIyRENer3WXgv3YHfseWePmStrPrWsg7pYahkUEy5EhPOrzqPzM50bvOCCICDsD2E4s/SMmatrOrV3oyvWr+ajNTUvg9q2ob3v7kXrdq2htW/YzMaCIGDYJ8OQHZcNUafMoTG1rYOaWHoZzBIuTTnKLcwshL5Yj8cWPNao9w37ZBh0hToUZRU1+jPNTfXdaIK664f614Fc9ZOBkHs9t9HnM0W9iMxLmQ0eEjPq+FRH2Le2R+alzMaWanZq34YAeZZB8nDJupKF9aPWN3qjPLLwCDS2GrgFuTXqfR6hHuj8TGeU3lXWHEUVn26n1jmHCOq+Osy4Dap1GSptQxauP/18Opb3WA5R37ieRNLe8ufAdH2+a6Pep7HRYGbMTPh2923U+8ytajtW/XZkwX2R5OHi5O2ExD2JyL6a3eD3EBHO/6dxQ2JGgiBg3H/HwT3YvbGlml3FnYLaNkprGAYAynvRanw6pZFpG7Jw/X49/FCWX4Zr26416n17/3J/SMyucQ/7EgQBrQNaK/JATK0HJ0DNB1iWWhbpw8XLCfau9tj9zu4Gv6fwdiH0RXo89lHjhsSMlLbi1b5jtpZhALWvAznr19pq4RHigV/f/7XBoxCmIbEFjRsSUyq514FU5FoGs5xzGfD2ACTuSmzwuZdDCw5Ba6eFW6CbOcqxKGs4eaz64TwrWAdKqH/Y34ch51pOg0+yX9te3svp9nw3c5ZlEUpZB80h9zKYJVz6/7k/SCSknkyt97VEhAvfXKjxqXRqI/fKbK6axvjVuAxqXwdKqT/sD2EAgNjvYut9rXEmc48QD2hsFXMRapNYW89drmUwy1Zg52IHFz8X7Przrnpfm5OQA32JHkM/HmqOUixGCSuzOaqNzapwGMAa1oGS6tfaatHm4TbYN2dfvUNj+hI9cuJzMOKzEbLX3RxyXkQhFaVsR2YJF0EQEDU/Cunn0mHQGep87a5Zu2Dvao9W/q3MUYpFVD3SURtTg1Lxye+qDUptlFr/yH+OREFGQb1XY55dehYQyuf8U6tqwWIF7UDO+s3Wf42YUn53bsyamFpfY9AZkLgrEYPmDFLdSjSq6RyFmpbFGhsUoJ5lME4gqNT62/ZrC42tBvvn7q/1NUSEg387iI5PdoRGq84hMWttB3Iy25agtdOi/aPtsfcve2vtUp9ddhZEhH5v9DNXGWZTcaegxmCpVr8KG5TSd8z1qdhjBB4caSqpfkEjoM+rfXBu5blaJ5a8vv86ygrK8MTyJyxcnQRI/cGi1HZgtnARhPInRhbnFCPjXEa1n5NI2DdnHzqN6WR6trZamM5PKGxlNlSN9auwQVXdMQPqWAbjzqDiDk3uIYy6DF0wFKJOxMU1F6v9jIjw00s/wburN5x9nGWorumIqPxG4YoHiGpsB1BmOzBrH9Y9yB2eHT2x6blN1Xovv2/+HbpCHZ5Ypp6jnUpH+xWPNqHcHUNFtdUPKGNjbIiaelxKPOKvSaVQUdEOzdbZFqGjQ7Hrz7uq3bGfdTUL927cw9g1YxW9DEam7cdK2oHpXCmU1w7MGi6CIOD5Lc8jLzkPlzZeMgVMWUEZfn75Z4T9IazWRxkrRV0bo+loUxnrskYNqV8pG2Ntqtavth5XjaFyPxQB5dcvCALGfDsGuiId9s1+cOWYaBCx4Q8b4B7sDr8efjJXWbuKbcC0DtTcDmrYlqBR3nZk9vEor85eiJgSgZ+m/QQXPxd4d/bG5vGbAQF4et3TivtCgAddTeMVYBV7XaYdApQbKnXWr5Ix5QatAwUvQ8X6a/r+TX9XCUcPRwxbOAx739uLNg+3QXB0MPa+uxd5KXl4/errilwWa1gHlUZ8VLYcZg8X47mXglsFWD9yPexd7UEgTNkzBfat6n5KnVyqziyg9JVYldrrB9S/DGqvvypBEDDg7QG4c+UOfnzhRzj7OKMkrwRj14yFe5C73OXVyBrWQV3LYPpvhRKooRMHNUBmRiZ0xTrY2tpW+5moFxG/PR4FmQUIGxWGVg9Je19LQX4BfAJ84NLKpcm/o+rRshw9k+ZsLGqvH1D/Mqi9fqDudkwi4fqv15GdkI3AqEB4dfZq1mdVxe24nDUsg6ThUlJcgov7L8qSpkSEXiN6wca26Z0xCb+KJpNkxyYjyRqVjFr6OuB23HwtvR0AEocLY4wxBijkMccVLy1VK9Egqrr+ilfQqBER1XqTn1pYwzpQeztWff2knG1IEeFyZcsVLOmwBAtsFmDTuE3I+K36TZdqoJSV2lhK2iAbyxgqZHgw8aaamZZHhesjNzEXf2/9d2x/dbvcpTSJ6TJfFVLidqOYYTFDmQEX117Esb8fQ05iDkJHhmLQnEEIeCRA7tIahIhABjJdN68mxiN+Nc0LZQpEQvml1Qq+w72xKh49V7wfRg3Ofn0W22dux4RfJiBsdJjc5TSKaBBV931XmvZFYbUrJlyMRL2Iy/+9jKOfHEXm5Ux0GNIBg2YPQuBjgYrfeRiHNQStenZ0aqvZtOO1wlCpSsk7jtoQETb8YQMyzmVgZuxMOHkp+yZpI+N2pZYDLDUcgCguXIxIJMT9HIcjHx9B+rl0tO3XFpGzIxH2RJiidyZq6gWoqbdV6XyElYdKVVVDRuk3weZn5GN5xHJ0GNIBz/73WUXXCjz4ftWwTakhVIwUGy5GRITEPYk48vER3Dh6A74Rvoh8PxJdnu2iyB24mnbYagjClhwqVakpZH7f/Ds2PbcJY1aPQfcp3eUup05qGA5TU6gYKT5cKko5nIIjC48gcU8iPMM8EfleJMInhUNrq5W7tErUMNSk9BrVOIeYpaglZH584UfE/RyHmTEz0bpda7nLqZHSh8MqhYrKDqxUFS5GaWfScHThUVz96Src2rvhkXcfQc9pPRU1db9oEAECNDbK22iV3LuqaVJBVrOq0/YrLWRK8kqwvPtyeIR4YMreKYpblxVnplbS91ZxvQLqCxUjVYaL0e3Y2zj292O49P0luPi6oP9b/dF7em/YudjJXRqA8osTIChv2EmJdXGoNJ2SQ+b6/utYM2wNor+IRv8/95e7HBMlnmexllAxUnW4GGXHZ+PYp8dwcc1FOLR2QL8/9UPf1/vCwc1B1rqU2ENQUo+q4tThAIdKcyl157T7rd04u+ws/ufs/8Cnq4/c5QBQ1nkWpa635rKKcDHKS8nD8c+O47dVv0Frr0Xf1/ui35/6wdlbvifkKenchinsZK6l0j0q4FCRmtJ2VrpiHVb2XgkbBxu8dOIlaO3kPUeqlPMsSu5xSsGqwsWo4FYBTiw+gbNLz5ZPhPdKLwx4ewBcH3KVpR6lXJUl93AYh4plKSlkMs5nYFX/VRj4l4EYumCoLDUAyhgOs/ZQMbLKcDEqyi7C6X+exqmvTkFXpEOPaT0w8N2BcA+07PMnlDA8JudwWLW76RUyHNGSKOGqo8MfHcbBeQcx7cg0BAyQZ+YNOYfDWkqoGFl1uBiV3ivFmaVncHLxSRTnFCN8Ujgi34uEVydpn0VRFzmHx+T6bGueokWt5LxfQtSL+GbwNyjKKsL036bDztmyF97INRymlkvHpdYiwsVIV6TD+VXncfwfx5Gfno/Oz3TGoNmDLPb8bzmGx+ToNXGoKJ9cIZMdn42ve36N7i90x+iloy3ymYA8w2EtNVSMWlS4GOlL9bi45iKOfXoMuUm5CBsdhsjZkWbvqsuxo7dkoHGoqI8cIXN2+Vlsf3U7Jm6fiNCRoWb/PMCyw2FqnBPOHFpkuBiJehGXvr+EowuP4s6VOwgcGohBswehQ1QHs+0ULTlEZanPakmTSVorS+4QiQgbntiAjN8yMDPG/JNbWmo4TI1TtJhTiw4XIxIJV7dexZGFR5BxPgNt+7fFoDmDEDoq1Cw7SUv0JizRS+J5v6yPpYZy8jPysSx8GQKHBuLZ7803uaUlhsM4VGrG4VIBESFhVwKOLjyKG8duwK+HHyLfj0TnpztLGgSW2PGbM8A4VKyfJULm8qbL2Pz8ZoxdMxYRkyMk/d1G5hwO41CpG4dLDYiofJLMj48g6dckeHXyQuR7keg2oZtkk2Sac8jKXL+bJ5NsecwdMj9O+RHXtl3DjJgZaB0g7eSW5hoOU8Jl3WrA4VKPtNNpOLLwCOJ+joNbBzcM/MtA9JjaAzb2zZ8k0xz3npijV8TzfjFz3aNRkleCZRHL4BnmiSl7pJvcUurhMCXdkKoWHC4NdDvmNo5+chSX/3sZLm1cMODtAej1Sq9mX6sv9V3zUv4+DhVWlTlCJmlfEtYOX4voxdHo/6fmT25pChYJhqo4VJqOw6WRsuKycOzTY4hZFwMHNwf0/3N/9HmtDxxaN22STCl7GlL0hHgySdYQUu90d83ahXNfn8MrZ1+BdxfvZtUmxXkWDpXm43BporyUPBz/x3H89p/fYONggz6v90H/P/Vv0mWVUpwjae6klDzvF2sKqXbCpsktHW3w0vGmT27Z3PMsLW2KFnPicGmm/Ix8nPjiBM4tPwciQu8ZvTHgrQFo5d+qUb+nucNZTX0/hwqTghQhk34uHf8Z8B9EvheJqPlRTaqhqedZOFSkx+EikaLsIpz66hROf3UaumIder7UEwPfGQi3Dm4Nen9zhseaMhzGk0kyc2nO1VSHFhzCob8dwh+P/hFt+7dt1Oc2ZTiMQ8V8OFwkVnK3xDRJZkleCSImRWDgewPh1bH+STKbMjzW2PfwFC3MUppyH4ioF/HNoG9QlN24yS0bOxzW0uf9sgQOFzMpKyzD+ZXncfyz4yjIKECXcV0Q+X4k/LrXPUlmY25+bExvh0OFyaWxIZN97f7kllO7Y/S/65/csjHDYRwqlsPhYmb6Uj0urr4/Seb1XHT8Q0dEzo5E2341d/lrCgwiQnZ2NgoKCuDi4gJPT08IgtCgIOJQYUrRmJA5s+wMdry2A5N2TELI4yHl76+jHdT3+zhULE/+B6lbORt7G/R6pRdej3sdY1aPQXZ8Nv4z4D9YO3wtkg8mo2q2GxsJiYTc3Fx8+eWXCA0Nhbe3NwIDA+Ht7Y3Q0FAsWbwEebl5tTYoEgmiQQQZ7jcorQCNVsMNislG0NzfBjUCiO5vn2LNx7a9Z/RGyOMh+Pmln5GRlFF3O8irox1U+BxBePD53A7Mj3suFkYi4coPV3Bk4RHcunALAY8EYNDsQQgZGVJpg9+1YxfGjRuHwuLC8vdVWE3C/f85Ojliyw9bEB0dXen387xfTA3q603kp+fjq85f4VLhJXxv+B4QGtkOeN4vWXG4yISIkLAzAUc+PoKbJ26iTc82iJwdic5jO2PP3j0YPWo0QIBIIghVejcobyjG4Ni+fTtGDB/BocJUqbaQ2b17N94Z+Q6epqfxA35ALGIrva/WdsChoggcLjIjIiQfTMbRhUeRtC8JHh09sPb6WpwvOw+RRAgQIEI0vd54tGb8N42ggZOjE1JSUuDu4c5jyUy1KobM3bt3ERAQgOKSYowRxyAUoViGZbiHewAeBIvxwMvUDm6UtwNuA/Ljcy4yEwQBgVGBmLJ3Cl46/hLuae9hVOkovEav4WE8DM39/5leDwEEggCh/N8JKCwqxLrv1nFvhalaxXMiq1evRnFRMUgk7MAOlKEMT+EpU6gAMLUDAeXncAqLCrFu/TpuAwrBPRcFISKEhoaiMLEQkYhEF3RBPvJxAidwHuehh97UoIDyxkUoP1EZFBSE+Ph4blhM9YztICkxyfRvgQjEFEzBLuzCaZyu/Ho8GAbjdqAcHC4KkpWVBW/vB5P2ecELAzEQEYhAMYpxEAdxHudNoVLT+z09PS1ZMmOSq9oOgPIeezSi0Qu9sAIrkIWsGtuA8f3cDuTHw2IKUlBQUOm/s5CFn/AT/ol/4gquwAADRFQ/wW+Un59viTIZM6uq7QAo7538il+RjGTYwa7WNgBwO1AK7rkoSE1HbI19Px+xMbXjdmAduOeiIJ6enggODm70eLEgCAgODoaHh4eZKmPMcrgdWAcOFwURBAFvvPFGk9775ptv8klMZhW4HVgHHhZTmLy8PLRt2xbFxcUQRbHe12s0Gjg6OiI1NRVubm7mL5AxC+B2oH7cc1EYNzc3bNmypfyaf03dq0ejKZ8r7IcffuAGxawKtwP143BRoOjoaGzfvh2Ojo7lU1hU6eYb/83R0RE7duzAiBEjZKqUMfPhdqBuHC4KFR0djdTUVCxZsgRBQUGVfhYUFIQlS5YgLS2NGxSzatwO1IvPuagAESEnJwf5+flo1aoVPDw8+KQla3G4HagLhwtjjDHJ8bAYY4wxyXG4MMYYkxyHC2OMMclxuDDGGJMchwtjjDHJcbgwxhiTHIcLY4wxyXG4MMYYkxyHC2OMMclxuDDGGJMchwtjjDHJcbgwxhiTHIcLY4wxyXG4MMYYk9z/A2kfI8u3I4IHAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 500x400 with 18 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.perturb(mag=0.01, mode='all')\n",
    "model.get_act(x)\n",
    "model.plot(metric='forward_n')\n",
    "# purple means both symbolic front (red) and spline front (black) are active"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "559c326a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c5479a7d",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pde loss: 7.37e-02 | bc loss: 3.11e-05 | l2: 6.75e-05 :  87%|█████▏| 87/100 [02:13<00:19,  1.54s/it]\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m/var/folders/6j/b6y80djd4nb5hl73rv3sv8y80000gn/T/ipykernel_25725/3218336899.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m    107\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    108\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'fine_tune'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m     \u001b[0ml2s_fine_tune\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    110\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'from_scratch'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    111\u001b[0m     \u001b[0ml2s_from_scratch\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/var/folders/6j/b6y80djd4nb5hl73rv3sv8y80000gn/T/ipykernel_25725/3218336899.py\u001b[0m in \u001b[0;36mtrain\u001b[0;34m()\u001b[0m\n\u001b[1;32m     94\u001b[0m             \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate_grid_from_samples\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_i\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     95\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 96\u001b[0;31m         \u001b[0moptimizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclosure\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     97\u001b[0m         \u001b[0msol\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msol_fun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx_i\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     98\u001b[0m         \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0malpha\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mpde_loss\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mbc_loss\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/optim/optimizer.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    383\u001b[0m                             )\n\u001b[1;32m    384\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 385\u001b[0;31m                 \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    386\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_optimizer_step_code\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    387\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/utils/_contextlib.py\u001b[0m in \u001b[0;36mdecorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    113\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    114\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mctx_factory\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    117\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/LBFGS.py\u001b[0m in \u001b[0;36mstep\u001b[0;34m(self, closure)\u001b[0m\n\u001b[1;32m    441\u001b[0m                     \u001b[0;32mdef\u001b[0m \u001b[0mobj_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    442\u001b[0m                         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_directional_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclosure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 443\u001b[0;31m                     loss, flat_grad, t, ls_func_evals = _strong_wolfe(\n\u001b[0m\u001b[1;32m    444\u001b[0m                         obj_func, x_init, t, d, loss, flat_grad, gtd)\n\u001b[1;32m    445\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/LBFGS.py\u001b[0m in \u001b[0;36m_strong_wolfe\u001b[0;34m(obj_func, x, t, d, f, g, gtd, c1, c2, tolerance_change, max_ls)\u001b[0m\n\u001b[1;32m     48\u001b[0m     \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclone\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmemory_format\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontiguous_format\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     49\u001b[0m     \u001b[0;31m# evaluate objective and gradient using initial step\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 50\u001b[0;31m     \u001b[0mf_new\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg_new\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobj_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     51\u001b[0m     \u001b[0mls_func_evals\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     52\u001b[0m     \u001b[0mgtd_new\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg_new\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/LBFGS.py\u001b[0m in \u001b[0;36mobj_func\u001b[0;34m(x, t, d)\u001b[0m\n\u001b[1;32m    440\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    441\u001b[0m                     \u001b[0;32mdef\u001b[0m \u001b[0mobj_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 442\u001b[0;31m                         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_directional_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclosure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    443\u001b[0m                     loss, flat_grad, t, ls_func_evals = _strong_wolfe(\n\u001b[1;32m    444\u001b[0m                         obj_func, x_init, t, d, loss, flat_grad, gtd)\n",
      "\u001b[0;32m~/Desktop/2022/research/code/pykan/kan/LBFGS.py\u001b[0m in \u001b[0;36m_directional_evaluate\u001b[0;34m(self, closure, x, t, d)\u001b[0m\n\u001b[1;32m    289\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_directional_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mclosure\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    290\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 291\u001b[0;31m         \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclosure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    292\u001b[0m         \u001b[0mflat_grad\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_gather_flat_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    293\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_set_param\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/utils/_contextlib.py\u001b[0m in \u001b[0;36mdecorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    113\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    114\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mctx_factory\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    117\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/var/folders/6j/b6y80djd4nb5hl73rv3sv8y80000gn/T/ipykernel_25725/3218336899.py\u001b[0m in \u001b[0;36mclosure\u001b[0;34m()\u001b[0m\n\u001b[1;32m     88\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     89\u001b[0m             \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0malpha\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mpde_loss\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mbc_loss\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 90\u001b[0;31m             \u001b[0mloss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     91\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     92\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/_tensor.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m    520\u001b[0m                 \u001b[0minputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    521\u001b[0m             )\n\u001b[0;32m--> 522\u001b[0;31m         torch.autograd.backward(\n\u001b[0m\u001b[1;32m    523\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgradient\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mretain_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcreate_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    524\u001b[0m         )\n",
      "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/torch/autograd/__init__.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m    264\u001b[0m     \u001b[0;31m# some Python versions print out the first line of a multi-line function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    265\u001b[0m     \u001b[0;31m# calls in the traceback and some print out the last line\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 266\u001b[0;31m     Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass\n\u001b[0m\u001b[1;32m    267\u001b[0m         \u001b[0mtensors\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    268\u001b[0m         \u001b[0mgrad_tensors_\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "from kan import *\n",
    "import matplotlib.pyplot as plt\n",
    "from torch import autograd\n",
    "from tqdm import tqdm\n",
    "\n",
    "dim = 2\n",
    "np_i = 21 # number of interior points (along each dimension)\n",
    "np_b = 21 # number of boundary points (along each dimension)\n",
    "ranges = [-1, 1]\n",
    "\n",
    "mode = 'fine_tune'\n",
    "#mode = 'from_scratch'\n",
    "\n",
    "if mode == 'from_scratch':\n",
    "    model = KAN(width=[2,[0,2],1], grid=5, k=3, seed=3)\n",
    "else:\n",
    "    # use the model defined above\n",
    "    pass\n",
    "\n",
    "def batch_jacobian(func, x, create_graph=False):\n",
    "    # x in shape (Batch, Length)\n",
    "    def _func_sum(x):\n",
    "        return func(x).sum(dim=0)\n",
    "    return autograd.functional.jacobian(_func_sum, x, create_graph=create_graph).permute(1,0,2)\n",
    "\n",
    "# define solution\n",
    "epsilon = 0.01\n",
    "sol_fun = lambda x: torch.sin(torch.pi*x[:,[0]])*torch.sin(torch.pi*x[:,[1]]) + epsilon * torch.sin(2*torch.pi*x[:,[0]])*torch.sin(2*torch.pi*x[:,[1]])\n",
    "source_fun = lambda x: -2*torch.pi**2 * (torch.sin(torch.pi*x[:,[0]])*torch.sin(torch.pi*x[:,[1]]) + 4 * epsilon * torch.sin(2*torch.pi*x[:,[0]])*torch.sin(2*torch.pi*x[:,[1]]))\n",
    "\n",
    "# interior\n",
    "sampling_mode = 'mesh' # 'ranndom' or 'mesh'\n",
    "\n",
    "x_mesh = torch.linspace(ranges[0],ranges[1],steps=np_i)\n",
    "y_mesh = torch.linspace(ranges[0],ranges[1],steps=np_i)\n",
    "X, Y = torch.meshgrid(x_mesh, y_mesh, indexing=\"ij\")\n",
    "if sampling_mode == 'mesh':\n",
    "    #mesh\n",
    "    x_i = torch.stack([X.reshape(-1,), Y.reshape(-1,)]).permute(1,0)\n",
    "else:\n",
    "    #random\n",
    "    x_i = torch.rand((np_i**2,2))*2-1\n",
    "\n",
    "# boundary, 4 sides\n",
    "helper = lambda X, Y: torch.stack([X.reshape(-1,), Y.reshape(-1,)]).permute(1,0)\n",
    "xb1 = helper(X[0], Y[0])\n",
    "xb2 = helper(X[-1], Y[0])\n",
    "xb3 = helper(X[:,0], Y[:,0])\n",
    "xb4 = helper(X[:,0], Y[:,-1])\n",
    "x_b = torch.cat([xb1, xb2, xb3, xb4], dim=0)\n",
    "\n",
    "steps = 100\n",
    "alpha = 0.01\n",
    "log = 1\n",
    "\n",
    "def train():\n",
    "    \n",
    "    l2s = []\n",
    "    \n",
    "    optimizer = LBFGS(model.parameters(), lr=1, history_size=10, line_search_fn=\"strong_wolfe\", tolerance_grad=1e-32, tolerance_change=1e-32, tolerance_ys=1e-32)\n",
    "    #if mode == 'from_scratch':\n",
    "    #    lr = 1e-2\n",
    "    #if mode == 'fine_tune':\n",
    "    #    lr = 5e-4\n",
    "    #optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n",
    "    \n",
    "    pbar = tqdm(range(steps), desc='description', ncols=100)\n",
    "\n",
    "    for _ in pbar:\n",
    "        \n",
    "        \n",
    "        def closure():\n",
    "            global pde_loss, bc_loss\n",
    "            optimizer.zero_grad()\n",
    "            # interior loss\n",
    "            sol = sol_fun(x_i)\n",
    "            sol_D1_fun = lambda x: batch_jacobian(model, x, create_graph=True)[:,0,:]\n",
    "            sol_D1 = sol_D1_fun(x_i)\n",
    "            sol_D2 = batch_jacobian(sol_D1_fun, x_i, create_graph=True)[:,:,:]\n",
    "            lap = torch.sum(torch.diagonal(sol_D2, dim1=1, dim2=2), dim=1, keepdim=True)\n",
    "            source = source_fun(x_i)\n",
    "            pde_loss = torch.mean((lap - source)**2)\n",
    "\n",
    "            # boundary loss\n",
    "            bc_true = sol_fun(x_b)\n",
    "            bc_pred = model(x_b)\n",
    "            bc_loss = torch.mean((bc_pred-bc_true)**2)\n",
    "\n",
    "            loss = alpha * pde_loss + bc_loss\n",
    "            loss.backward()\n",
    "            return loss\n",
    "\n",
    "        if _ % 5 == 0 and _ < 20:\n",
    "            model.update_grid_from_samples(x_i)\n",
    "\n",
    "        optimizer.step(closure)\n",
    "        sol = sol_fun(x_i)\n",
    "        loss = alpha * pde_loss + bc_loss\n",
    "        l2 = torch.mean((model(x_i) - sol)**2)\n",
    "        l2s.append(l2.item())\n",
    "\n",
    "        if _ % log == 0:\n",
    "            pbar.set_description(\"pde loss: %.2e | bc loss: %.2e | l2: %.2e \" % (pde_loss.cpu().detach().numpy(), bc_loss.cpu().detach().numpy(), l2.detach().numpy()))\n",
    "\n",
    "    return l2s\n",
    "    \n",
    "    \n",
    "if mode == 'fine_tune':\n",
    "    l2s_fine_tune = train()\n",
    "if mode == 'from_scratch':\n",
    "    l2s_from_scratch = train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bc3f1e71",
   "metadata": {},
   "outputs": [],
   "source": [
    "l2s_fine_tune"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ac938c7e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rNmcTif953/+JwGgsWPH0rFjx3zqBytXrqRHHnmEAND1119Px48fN/qltWkcLgY5d+4cTZs2jQDQHXfcUWvEIUkSLV++nIYPH04hISEUHR1N/fv3p6FDh1KfPn2oQ4cOFBERQdOnT6e8vDzt9/Ly8mjw4MFkt9vppZde4rM3Znq5ubl0+eWXk8PhoJdffrnWMetrP1i9ejUlJCRQfHw8rVq1yoiXxYiI7+digO3bt2Pq1Kk4deoU3n77bUydOrXen6usrMTOnTuxYcMG7Nu3D2VlZYiPj8fQoUMxatQopKamwmaz1fodl8uFp556Ci+99BLGjBmDefPm8c4ZZjpEhHnz5uGBBx5A165dsXjxYgwaNKjen/WlH5w4cQJ33nknVq1ahYcffhgvvPACL/IHmsHh1qZIkkTPP/882e12GjZsGB08eLBFv9+SYnzffPMNde7cmeLi4mj58uUtbSpjfnP27FmaPHkyAaA777yTysrKWvT7ze0HsizTnDlzKCQkhAYOHEi//vqrL81lPuJwCZDCwkIaNWoUCYJAjz/+OLlcLr8/58mTJ2nChAkEgP785z9TVVWV35+TscZs3ryZevToQR06dKAlS5YE5Dl/+ukn6tOnD0VERGgFMZn/cbgEwLJlyygmJoYuueQSWr9+fUCfW1EUeu211yg0NJQyMjLol19+CejzM0bkGbU/++yzZLPZ6Morr6RDhw4F9PnLy8vpT3/6EwGgSZMm0dmzZwP6/G0Rh4sfVVZW0n333UcA6MYbb6TTp08b1pY9e/ZQv379KDw8nN555x0+e2MBc/ToUbr66qtJFEV6+umnye12G9aWTz/9lKKioqh79+60adMmw9rRFnC4+ElOTg5deumlFBYWRm+++aYpvswrKironnvuIQB08803U0lJidFNYkHus88+o+joaOrWrRv98MMPRjeHiIiOHDlCmZmZJIoiPfPMM4aGXTDjcNGZoij0xhtvUGhoKF166aWUk5NjdJMu4t3hv//+e6Obw4JQRUUF3X333aY9kXG73fTMM8+QKIqUmZlJR44cMbpJQYfDRUenTp2iG264gQDQ/fffT5WVlUY3qUHeUxVPPfUUn70x3fz888/aFOy7775rilF7QzZu3Ejdu3enqKgo+vTTT41uTlDhcNHJunXrqGvXrhQbG0tffvml0c1pFkmSaPbs2WSz2eiK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\n",
      "text/plain": [
       "<Figure size 500x400 with 18 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.plot()\n",
    "if mode == 'fine_tune':\n",
    "    plt.savefig('./pde_fine_tune.pdf', bbox_inches='tight', dpi=200)\n",
    "if mode == 'from_scratch':\n",
    "    plt.savefig('./pde_from_scratch.pdf', bbox_inches='tight', dpi=200)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c411afc0",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'l2s_from_scratch' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m/var/folders/6j/b6y80djd4nb5hl73rv3sv8y80000gn/T/ipykernel_25292/3736391453.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m# sweep epsilon. This is for epsilon = 0.01\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml2s_fine_tune\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml2s_from_scratch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0myscale\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'log'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'w/ prior knowledge'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'w/o prior knowledge'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'l2s_from_scratch' is not defined"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# sweep epsilon. This is for epsilon = 0.01\n",
    "plt.plot(l2s_fine_tune)\n",
    "plt.plot(l2s_from_scratch)\n",
    "plt.yscale('log')\n",
    "plt.legend(['w/ prior knowledge', 'w/o prior knowledge'])\n",
    "plt.ylabel('L2 squared error', fontsize=15)\n",
    "plt.xlabel('training steps', fontsize=15)\n",
    "plt.savefig('./pde_loss.pdf', bbox_inches='tight', dpi=200)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e56f1db2",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
